package com.hrm.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;
import com.hrm.domain.Job;
import com.hrm.domain.Employee;
import com.hrm.domain.JSONJobResult;
import com.hrm.domain.JSONUserResult;
import com.hrm.domain.PageHelper;
import com.hrm.service.EmployeeService;
import com.hrm.service.JobService;
import com.hrm.service.Impl.EmployeeServiceImpl;
import com.hrm.service.Impl.JobServiceImpl;

/*
 * 职位数据控制层
 */
@WebServlet(urlPatterns = { "/getJobs", "/addJob", "/delJob", "/delJobs", "/modifyJob"  })
@SuppressWarnings("all") // 使用注解抑制警告信息
public class JobController extends HttpServlet {

	// 定义全局变量
	private JobService js = new JobServiceImpl(); // CURD职位数据

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String url = request.getRequestURI(); // 获取跳转路径
		// 进行截取并判断
		String operator = url.substring(url.lastIndexOf("/") + 1);
		if ("getJobs".equals(operator)) { // 分页查询 + 模糊
			getJobs(request, response);
		} else if ("addJob".equals(operator)) { // 添加职位
			addJob(request, response);
		} else if ("delJob".equals(operator)) { // 删除指定职位
			delJob(request, response);
		} else if ("delJobs".equals(operator)) { // 删除多个职位
			delJobs(request, response);
		} else if ("modifyJob".equals(operator)) { // 修改指定职位的信息
			modifyJob(request, response);
		}
	}

	// 分页查询 + 模糊
	private void getJobs(HttpServletRequest request, HttpServletResponse response) throws IOException {
		PageHelper ph = new PageHelper(); // 简化分页查询
		List<Job> jobs = new ArrayList<>(); // 用于存储查询到的数据
		int count = 0; // 用于记录数据条数
		int flag = 0; // 用于判断情况
		String jobName = request.getParameter("jobname");
		// 获取查询出的数据记录数,并设置模糊查询
		if ("".equals(jobName)) { // 查询条件没有输入时
			flag = 1;
			count = js.getCount(flag);
		} else { // 输入了查询条件
			flag = 2;
			jobName = "%" + jobName + "%";
			count = js.getCount(flag, jobName);
		}
		ph.setPageIndex(1); // 设置当前页的初始数据
		// 获取当前页
		String pageNo = request.getParameter("pageNo");
		if (pageNo != null) { // 说明点了页码
			ph.setPageIndex(Integer.parseInt(pageNo)); // 重新设置页码
			ph.setTotalPageSum(ph.getTotalPageSum()); // 重新设置总页数
		}
		ph.setPageSize(ph.getPageSize()); // 设置每页显示的记录条数
		ph.setTotalRecordSum(count); // 设置总记录条数
		// 获取当前页的数据
		if (flag == 1) { // 查询条件没有输入时
			jobs = js.getJobsByTerm(flag, ph.getStartRowNum(), ph.getPageSize());
		} else { // 输入了查询条件
			jobs = js.getJobsByTerm(flag, jobName, ph.getStartRowNum(), ph.getPageSize());
		}
		ph.setTotalPageSum(ph.getTotalPageSum()); // 设置总页数
		// 将查询到的数据转化为json
		JSONJobResult aur = new JSONJobResult();
		aur.setList(jobs);
		aur.setPh(ph);
		if (jobs != null && jobs.size() > 0) {
			aur.setMsg("success");
		}
		// 把aur对象转换成json数据
		String JobsJson = JSON.toJSONString(aur);
		// 把结果响应给客户端
		PrintWriter out = response.getWriter();
		out.write(JobsJson);
		out.flush();
		out.close();
	}

	// 添加职位
	private void addJob(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// 获取前台传递的参数
		String jName = request.getParameter("jname");
		String jRemark = request.getParameter("jremark");
		String msg = ""; // 定义返回消息
		// 多种判断,防止异常
		if (jName != "" && jRemark != "") {
			// 判断职位是否重复
			Job job = js.getJobByJN(jName);
			if (job == null) { // 没有重复
				// 进行添加
				Job d = new Job(jName, jRemark);
				js.addJob(d);
				msg = "success";
			} else { // 职位重复
				msg = "repeat";
			}
		} else {
			msg = "fail"; // 存在空数据
		}
		// 将返回信息封装
		JSONJobResult aur = new JSONJobResult();
		aur.setMsg(msg);
		// 把aur对象转换成json数据
		String mJSON = JSON.toJSONString(aur);
		// 把结果响应给客户端
		PrintWriter out = response.getWriter();
		out.write(mJSON);
		out.flush();
		out.close();
	}

	// 删除职位
	private void delJob(HttpServletRequest request, HttpServletResponse response) throws IOException {
		int jobID = Integer.parseInt(request.getParameter("jid"));
		// 删除指定用户
		String msg = ""; // 定义返回信息
		// 获取要删除的职位的信息
		Job job = js.getJobByID(jobID);
		// 判断该职位下是否存在员工
		EmployeeService es = new EmployeeServiceImpl();
		List<Employee> emps = new ArrayList<>();
		emps = es.getEmpsByJobID(jobID);
		if (emps.isEmpty()) { // 如果返回的集合为空,则说明该职位下没有员工,可以直接删除
			// 删除职位
			js.delJob(jobID);
			msg = "success";
		} else { // 反之则说明该职位下有员工,则创建闲置职位,对员工进行安排
			// 判断闲置部是否存在
			Job newJob = js.getJobByJN("闲置");
			if (newJob == null) { // 不存在才创建
				// 创建闲置职位
				newJob = new Job("闲置", "用于安排暂时没有职位的员工");
				js.addJob(newJob);
			}
			// 获取闲置部的ID
			Job xz = js.getJobByJN("闲置");
			int xzID = xz.getjID();
			// 将需要删除的职位下的员工进行闲置安排
			for (Employee emp : emps) {
				es.modifyEmpJobByID(xzID, emp.getEmpID());
			}
			// 删除职位
			js.delJob(jobID);
			msg = "xzcl";
		}
		// 将返回信息封装
		JSONJobResult aur = new JSONJobResult();
		aur.setMsg(msg);
		// 把aur对象转换成json数据
		String mJSON = JSON.toJSONString(aur);
		// 把结果响应给客户端
		PrintWriter out = response.getWriter();
		out.write(mJSON);
		out.flush();
		out.close();
	}

	// 删除多个职位
	private void delJobs(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// 获取前台传过来的数据
		String jobsJSON = request.getParameter("jobs");
		// 将JSON数组转换为集合
		List<String> jobs = JSON.parseArray(jobsJSON, String.class);
		int flag = 0; // 标识符判断权限问题
		String msg = ""; // 定义返回信息
		// 循环判断
		for (int i = 0; i < jobs.size(); i++) {
			String jobID = jobs.get(i).replaceAll(" ", "");
			// 判断该职位下是否存在员工
			EmployeeService es = new EmployeeServiceImpl();
			List<Employee> emps = new ArrayList<>();
			emps = es.getEmpsByJobID(Integer.parseInt(jobID));
			if (emps.isEmpty()) { // 如果返回的集合为空,则说明该职位下没有员工,可以直接删除
				// 删除职位
				js.delJob(Integer.parseInt(jobID));
			} else { // 反之则说明该职位下有员工,则创建闲置职位,对员工进行安排
				// 判断闲置部是否存在
				Job newJob = js.getJobByJN("闲置");
				if (newJob == null) { // 不存在才创建
					// 创建闲置职位
					newJob = new Job("闲置", "用于安排暂时没有职位的员工");
					js.addJob(newJob);
				}
				// 获取闲置部的ID
				Job xz = js.getJobByJN("闲置");
				int xzID = xz.getjID();
				// 将需要删除的职位下的员工进行闲置安排
				for (Employee emp : emps) {
					es.modifyEmpJobByID(xzID, emp.getEmpID());
				}
				// 删除职位
				js.delJob(Integer.parseInt(jobID));
				flag = 1;
			}
		}
		if (flag == 0) { // 删除的职位都没有员工
			msg = "success";
		} else { // 删除的职位有存在员工的情况
			msg = "xzcl";
		}
		// 将返回信息封装
		JSONJobResult aur = new JSONJobResult();
		aur.setMsg(msg);
		// 把aur对象转换成json数据
		String mJSON = JSON.toJSONString(aur);
		// 把结果响应给客户端
		PrintWriter out = response.getWriter();
		out.write(mJSON);
		out.flush();
		out.close();
	}

	// 修改指定职位的信息
	private void modifyJob(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// 获取前台传递的参数
		int jobID = Integer.parseInt(request.getParameter("id"));
		String newJobName = request.getParameter("njname");
		String remark = request.getParameter("remark");
		String msg = ""; // 定义返回消息
		// 多种判断,防止异常
		if (newJobName != "" && remark != "") {
			// 判断是否与其他职位的名称相同
			Job fJob = js.getJobByJN(newJobName);
			if (fJob == null || (fJob != null && (fJob.getjID() == jobID))) { // 没有与其他职位产生冲突
				// 进行修改
				Job newJob = new Job(newJobName, remark);
				js.modifyJobByID(newJob, jobID);
				msg = "success";
			} else { // 职位名称重复
				msg = "repeat";
			}
		} else {
			msg = "fail"; // 存在空数据
		}
		// 将返回信息封装
		JSONJobResult aur = new JSONJobResult();
		aur.setMsg(msg);
		// 把aur对象转换成json数据
		String mJSON = JSON.toJSONString(aur);
		// 把结果响应给客户端
		PrintWriter out = response.getWriter();
		out.write(mJSON);
		out.flush();
		out.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
